package cn.wolfcode.luowowo.util;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;

import java.lang.reflect.Method;
import java.util.List;

public class DBHelper {

    /**
     * 返回分页数据对象
     *static<T>声明返回类型  Page<T>返回类型
     */
    public static <T> Page<T> query(MongoTemplate template, Class<T> clz,  Query query, Pageable pageable){
        //pageResult
        //查询总条数-count 如果总条数为0，返回空的页面结果集
        //否则查询带条件的结果集，最后封装进页面结果集对象中
        //相当于sql:select count(*) from table where ...
        Long rows = template.count(query, clz);
        if(rows== 0){
            return  Page.empty();
        }
        query.with(pageable);
        //结果集-list
        //相当于sql:select * feom table where ... limit
        List<T> list = template.find(query, clz);
        //组装分页数据，Page对象要自己定义，包含总页数，总条数，每页大小及当前页等信息
        //Page对象要自己定义，springData中有提供，直接使用也可以
        return new PageImpl(list, pageable, rows);
    }

    /**
     * 更新
     * @param template
     * @param query 条件
     * @param source 数据
     * @param fields 更新字段
     */
    public static void update(MongoTemplate template, Query query, Object source, String... fields){
        Update update = new Update();
        Class<?> clz = source.getClass();
        for (String field : fields) {
            try {
                //name    getName
                Method method = clz.getMethod("get" + field.substring(0, 1).toUpperCase()
                        + field.substring(1));
                Object o = method.invoke(source);  //soucre.getName();
                update.set(field, o);  //name  soucre.getName()
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        template.updateMulti(query,update, clz);
    }


}